package main

import (
	"context"
	"dfx_cmdb/cmdb-agent/apps/blacklist"
	"dfx_cmdb/cmdb-agent/config"
	"dfx_cmdb/cmdb-agent/global"
	"dfx_cmdb/cmdb-agent/routes"
	"dfx_cmdb/cmdb-agent/version"
	"flag"
	"fmt"

	"github.com/zeromicro/go-zero/core/logc"
)

var path = flag.String("f", "./etc/config.yml", "config file path")
var vs = flag.Bool("v", false, "show version info")

// main 函数是程序的入口点，负责初始化服务、配置和日志系统
// 该函数无参数，无返回值
func main() {
	// 解析命令行参数
	flag.Parse()

	// 创建可取消的 context 用于优雅关闭
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	// 如果指定了 -v 参数，打印版本信息后退出
	if *vs {
		version.Version()
		return
	}

	// 1) 先初始化全局服务实例
	global.Svc = global.NewSvc()

	// 2) 加载配置并挂到 Svc
	cfg := config.NewConfig()
	cfg.LoadConfig(*path)
	global.Svc.Config = cfg

	// 3) 初始化日志
	global.InitLogConfig(ctx, global.Svc.Config)

	global.BlacklistCronStatusMap.Store("haproxy", global.Svc.Config.Function.BlackList.Haproxy)
	global.BlacklistCronStatusMap.Store("ebpf", global.Svc.Config.Function.BlackList.EBPF)
	global.BlacklistCronStatusMap.Store("openresty", global.Svc.Config.Function.BlackList.Openresty)
	b, err := global.CheckConfigBlacklistStatus(ctx)
	if err != nil {
		panic(err)
	}
	if !b {
		panic("请检查配置文件")
	}

	// 初始化日志配置
	global.InitLogConfig(ctx, global.Svc.Config)

	initApp(ctx)

	fmt.Println("当前启动功能:")
	for k, v := range global.AppStatus {
		fmt.Printf("\t%s:%v\n", k, v)
	}

	routes.Routes()
}

func initApp(ctx context.Context) {
	var err error
	// 1) 初始化黑名单服务
	global.AppStatus[global.AGENT_BLACKLIST], err = blacklist.InitCron(ctx)
	if err != nil {
		logc.Errorf(ctx, "初始化黑名单服务失败: %v", err)
	}
}
